home *** CD-ROM | disk | FTP | other *** search
- (*$C-,U-,R-,V-,K-*)
- PROGRAM FixBrack;
-
- (*--------------------------------------------------------------------------*)
- (* *)
- (* Program: FixBrack *)
- (* *)
- (* Purpose: Neatens output of Dave Baldwin's INLINE assembler for *)
- (* Turbo Pascal so that the code is lined up properly. *)
- (* *)
- (* Usage: Compile and run in the usual way. You will be prompted *)
- (* for the input and output file names. *)
- (* *)
- (*--------------------------------------------------------------------------*)
-
- TYPE
- AnyStr = STRING[255];
- NameStr = STRING[40];
- Text_File = TEXT[4096];
-
- VAR
- OldObjFile : Text_File;
- OldObjName : NameStr;
- NewObjFile : Text_File;
- NewObjName : NameStr;
-
- (*--------------------------------------------------------------------------*)
- (* Dupl -- Duplicate a character n times *)
- (*--------------------------------------------------------------------------*)
-
- FUNCTION Dupl( Dup_char : Char; Dup_Count: INTEGER ) : AnyStr;
-
- (*--------------------------------------------------------------------------*)
- (* *)
- (* Function: Dupl *)
- (* *)
- (* Purpose: Duplicate a character n times *)
- (* *)
- (* Calling Sequence: *)
- (* *)
- (* Dup_String := Dupl( Dup_Char: Char; Dup_Count: INTEGER ): AnyStr; *)
- (* *)
- (* Dup_Char --- Character to be duplicated *)
- (* Dup_Count --- Number of times to duplicate character *)
- (* Dup_String --- Resultant duplicated string *)
- (* *)
- (* Note: If Dup_Count <= 0, a null string is returned. *)
- (* *)
- (* Calls: None *)
- (* *)
- (* *)
- (* Remarks: *)
- (* *)
- (* This routine could be programmed directly in Turbo as: *)
- (* *)
- (* VAR *)
- (* S : AnyStr; *)
- (* *)
- (* BEGIN *)
- (* *)
- (* FillChar( S[1], Dup_Count, Dup_Char ); *)
- (* S[0] := CHR( Dup_Count ); *)
- (* *)
- (* Dupl := S; *)
- (* *)
- (* END; *)
- (* *)
- (*--------------------------------------------------------------------------*)
-
- BEGIN (* Dupl *)
-
- INLINE( $16/ (* PUSH SS ; Push stack ptr *)
- $07/ (* POP ES ; For result addressing *)
- $8B/$4E/$04/ (* MOV CX,[BP+4] ; Pick up dup count *)
- $88/$4E/$08/ (* MOV [BP+8],CL ; Store result length *)
- $8B/$46/$06/ (* MOV AX,[BP+6] ; Get char to duplicate *)
- $8D/$7E/$09/ (* LEA DI,[BP+9] ; Result address *)
- $FC/ (* CLD ; Set direction flag *)
- $F3/$AA (* REPLSTOSB ; Perform duplication *)
- );
-
- END (* Dupl *);
-
- PROCEDURE Process_Files;
-
- VAR
- S : AnyStr;
- L : INTEGER;
- I : INTEGER;
- MaxBrack: INTEGER;
-
- BEGIN (* Process_Filess *)
-
- ASSIGN( OldObjFile, OldObjName );
- RESET ( OldObjFile );
-
- ASSIGN ( NewObjFile, NewObjName );
- REWRITE( NewObjFile );
-
- WRITELN('Modifying ',OldObjName);
-
- MaxBrack := 0;
-
- REPEAT
-
- READLN( OldObjFile, S );
-
- I := POS( '{' , S );
-
- IF ( I > MaxBrack ) THEN
- MaxBrack := I;
-
- UNTIL ( EOF( OldObjFile ) );
-
- RESET( OldObjFile );
-
- REPEAT
-
- READLN( OldObjFile, S );
-
- I := POS( '{' , S );
-
- IF ( I > MaxBrack ) THEN
- MaxBrack := I;
-
- IF ( I = 0 ) THEN
- WRITELN( NewObjFile , S )
- ELSE
- BEGIN
- L := LENGTH( S );
- WRITELN( NewObjFile, COPY( S, 1, I - 1 ),
- DUPL( ' ' , MaxBrack - I ), COPY( S, I, L - I + 1 ) );
- END;
-
- UNTIL ( EOF( OldObjFile ) );
-
- CLOSE( OldObjFile );
-
- WRITELN;
-
- CLOSE( NewObjFile );
-
- END (* Process_Filess *);
-
- PROCEDURE Get_File_Names;
-
- BEGIN (* Get_File_Names *)
-
- IF ParamCount > 0 THEN
- OldObjName := ParamStr( 1 )
- ELSE
- BEGIN
- WRITE('File to read: ');
- READLN( OldObjName );
- END;
-
- IF ParamCount > 1 THEN
- NewObjName := ParamStr( 2 )
- ELSE
- BEGIN
- WRITE('File to write: ');
- READLN( NewObjName );
- END;
-
- END (* Get_File_Names *);
-
- BEGIN (* FixBrack *)
-
- Get_File_Names;
-
- Process_Files;
-
- END (* FixBrack *).